package persistencia.clientes;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import modelo.Cliente;
import modelo.Direccion;
import modelo.Empresa;
import modelo.Factura;
import modelo.enums.Tarifa;
import modelo.enums.TipoVia;
import modelo.utils.ListaClientes;

public class BDClienteImpl implements BDCliente
{

    private static final int CANTIDAD = 3;
    private List<Cliente> clientes;

    private EntityManagerFactory emf;
    private EntityManager em;
    private EntityTransaction tx;

    public BDClienteImpl()
    {
        super();
        emf = Persistence.createEntityManagerFactory("test");
        em = emf.createEntityManager();
        tx = em.getTransaction();
        initDB();
    }

    private void initDB()
    {
        clientes = new ArrayList<Cliente>();

        Direccion direccion = new Direccion(TipoVia.AVENIDA, "Calle de pruebas", "12005", "123",
                "8", "24");
        for (int i = 0; i < CANTIDAD; i++)
        {
            Empresa empresa = new Empresa("Nombre " + Integer.toString(i), Integer.toString(i),
                    direccion, Tarifa.NORMAL);
            insert(empresa);
        }
    }

    @Override
    public ListaClientes getAll()
    {
        Query query = em.createNamedQuery(Cliente.RECUPERA_TODOS);
        return new ListaClientes(query.getResultList());
    }

    @Override
    public Cliente findByNIF(String nif)
    {
        for (Cliente cliente : clientes)
            if ((cliente.getNif()).equalsIgnoreCase(nif))
                return cliente;
        return CLIENTE_NULL;
    }

    @Override
    public boolean update(Cliente cliente)
    {
        Cliente enLista = findByNIF(cliente.getNif());
        if (enLista != null)
        {
            enLista.actualiza(cliente);
            return true;
        }
        return false;
    }

    @Override
    public boolean delete(String nif)
    {
        Cliente cliente = findByNIF(nif);
        if (cliente == CLIENTE_NULL)
            return false;
        else
            clientes.remove(cliente);
        return true;
    }

    @Override
    public void insert(Cliente cliente)
    {
        tx.begin();

        em.persist(cliente);

        tx.commit();
    }

}